#ifndef _PREFERENCES_H_
#define _PREFERENCES_H_

class ConfigProcessor;
class Preferences
    {
public:
    static Preferences * default_type();

    virtual bool init () { return true; }

    virtual ConfigProcessor * processor (const char *label) { return 0; }

    virtual void set_default (const string &key, const string &value)
        { set(key, value, true); }
    virtual const char *get(const string &key)=0;
    virtual void set(const string &key, const string &value,
                     bool set_default = false)=0;
    virtual void unset(const string &key)=0;

    virtual bool get_int (const string &key, int *value)
        { const char *p = get(key);
          return ( p && sscanf(p, "%d", value) == 1 );
        }
    virtual void set_int (const string &key, int value)
        { char buf[20]; sprintf(buf, "%d", value);
          string str(buf); set(key, str);
        }

    virtual bool is_set(const string &key)=0;
    virtual bool is_default(const string &key)=0;
    virtual bool is_false(const string &key)
        { return ( !is_set(key) || is_false_string(get(key)) ); }
    virtual bool is_true(const string &key)
        { const char *p;
          return ( is_set(key) && !(p = get(key)) || *p == '\0' ||
                   is_true_string(p) );
        }
    };

#endif // _PREFERENCES_H_
